gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringdib/rdib_alpha.cpp
/********************************************************************** // // // ########## ###### ######### # ###### # // ############# ########### ######### ######### ### // ######## # ### ## ############# ## ## ##### # #### // #### ## ## ### ### ### # # ##### ##### // # ### # # ## ## ## ## ### // ## ###### ## ## #### #### # # ## // ######### ### ## ### ####### ###### ## ## ### // ###### ## ###### ## ## #### # ## #### // ####### ## ###### ## ### ## ## ### ###### // ######### ## ###### ## ###### ### ## ### # ##### // ## ###### ####### ### #### ## ## ####### ######## ## #### // ## #### ### # ### ### ## ########## ###### ## #### // ## ## ## ######### #### # ## // # ### // ## // ### // ## // // // RingSDK多媒体类库 ringdib.lib //作者:临风 // //版本:1.0 // //声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到 // 你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在 // 修改的同时给作者一份同样的副本。 // 本类库不得用于任何商业用途,如确实需要,请与作者联系。 // //e-mail:ringphone@sina.com // //原文件名:rdib_alpha.cpp // //说明:RingDIB的插件类(ALPHA混合)实现 // **********************************************************************/ #define MAKE_SELF_LIB #include "ringdib.h" dibFilterALPHA::~dibFilterALPHA() { } void dibFilterALPHA::Fill(int r,int g,int b,int a) { if(!m_rdib->Data()) return; BYTE *dst = (BYTE*)m_rdib->Data(); int nSize = m_rdib->Width() * m_rdib->Height(); while ( nSize-- ) { dst[0]=(BYTE)(((b-dst[0])*a+(dst[0]<<8))>>8); dst[1]=(BYTE)(((g-dst[1])*a+(dst[1]<<8))>>8); dst[2]=(BYTE)(((r-dst[2])*a+(dst[2]<<8))>>8); dst+=4; } } void dibFilterALPHA::FillGlass(COLORREF color) { if(!m_rdib->Data()) return; COLORREF* crColor = m_rdib->Data(); COLORREF* crBak = crColor; int w = m_rdib->Width(); int h = m_rdib->Height(),i,j; for(j=0;j<h;j++ ) { for(i=0;i<w;i++) { if((i+j)&0x1) *crColor = color; crColor ++; } crBak += w; crColor = crBak; } } void dibFilterALPHA::Blend(RingDIB *dib,int A) { if(!m_rdib->Data() || !dib->Data() || m_rdib->Width()!=dib->Width() || m_rdib->Height()!=dib->Height()) return; BYTE *src=(BYTE*)dib->Data(); BYTE *dst=(BYTE*)m_rdib->Data(); int nSize=m_rdib->Width()*m_rdib->Height(); while ( nSize-- ) { dst[0]=(BYTE)(((src[0]-dst[0])*A+(dst[0]<<8))>>8); dst[1]=(BYTE)(((src[1]-dst[1])*A+(dst[1]<<8))>>8); dst[2]=(BYTE)(((src[2]-dst[2])*A+(dst[2]<<8))>>8); dst+=4; src+=4; } } void dibFilterALPHA::Darken(RingDIB *dib) { if(!m_rdib->Data() || !dib->Data() || m_rdib->Width()!=dib->Width() || m_rdib->Height()!=dib->Height()) return; BYTE *src=(BYTE*)dib->Data(); BYTE *dst=(BYTE*)m_rdib->Data(); int nSize=m_rdib->Width()*m_rdib->Height(); while(nSize--) { dst[0]=(BYTE)((src[0]<dst[0]) ? src[0] : dst[0]); dst[1]=(BYTE)((src[1]<dst[1]) ? src[1] : dst[1]); dst[2]=(BYTE)((src[2]<dst[2]) ? src[2] : dst[2]); dst+=4; src+=4; } } void dibFilterALPHA::Difference(RingDIB *dib) { if(!m_rdib->Data() || !dib->Data() || m_rdib->Width()!=dib->Width() || m_rdib->Height()!=dib->Height()) return; BYTE *src=(BYTE*)dib->Data(); BYTE *dst=(BYTE*)m_rdib->Data(); int nSize=m_rdib->Width()*m_rdib->Height(); while ( nSize-- ) { int Difference; Difference=src[0]-dst[0]; dst[0]=(BYTE)((Difference<0) ? -Difference : Difference); Difference=src[1]-dst[1]; dst[1]=(BYTE)((Difference<0) ? -Difference : Difference); Difference=src[2]-dst[2]; dst[2]=(BYTE)((Difference<0) ? -Difference : Difference); dst+=4; src+=4; } } void dibFilterALPHA::Lighten (RingDIB *dib) { if (!m_rdib->Data() || !dib->Data() || m_rdib->Width()!=dib->Width() && m_rdib->Height()!=dib->Height()) return; BYTE *src=(BYTE*)dib->Data(); BYTE *dst=(BYTE*)m_rdib->Data(); int nSize=m_rdib->Width()*m_rdib->Height(); while ( nSize-- ) { dst[0]=(BYTE)((src[0]>dst[0]) ? src[0] : dst[0]); dst[1]=(BYTE)((src[1]>dst[1]) ? src[1] : dst[1]); dst[2]=(BYTE)((src[2]>dst[2]) ? src[2] : dst[2]); dst+=4; src+=4; } } void dibFilterALPHA::Multiply (RingDIB *dib) { if(!m_rdib->Data() || !dib->Data() || m_rdib->Width()!=dib->Width() && m_rdib->Height()!=dib->Height()) return; BYTE *src=(BYTE*)dib->Data(); BYTE *dst=(BYTE*)m_rdib->Data(); int nSize=m_rdib->Width()*m_rdib->Height(); while ( nSize-- ) { dst[0]=(BYTE)(((src[0])*(dst[0]))>>8); dst[1]=(BYTE)(((src[1])*(dst[1]))>>8); dst[2]=(BYTE)(((src[2])*(dst[2]))>>8); dst+=4; src+=4; } } void dibFilterALPHA::Screen(RingDIB *dib) { if(!m_rdib->Data() || !dib->Data() || m_rdib->Width()!=dib->Width() && m_rdib->Height()!=dib->Height()) return; BYTE *src=(BYTE*)dib->Data(); BYTE *dst=(BYTE*)m_rdib->Data(); int nSize=m_rdib->Width()*m_rdib->Height(); while ( nSize-- ) { dst[0]=(BYTE)(255-(((255-src[0])*(255-dst[0]))>>8)); dst[1]=(BYTE)(255-(((255-src[1])*(255-dst[1]))>>8)); dst[2]=(BYTE)(255-(((255-src[2])*(255-dst[2]))>>8)); dst+=4; src+=4; } } void dibFilterALPHA::Xor(RingDIB *dib) { if(!m_rdib->Data() || !dib->Data() || m_rdib->Width()!=dib->Width() && m_rdib->Height()!=dib->Height()) return; LPDWORD src=(LPDWORD)dib->Data(); LPDWORD dst=(LPDWORD)m_rdib->Data(); int nSize=m_rdib->Width()*m_rdib->Height(); while(nSize--) { *dst++ ^= *src++; } } ////////////////////////////////////////////////////////////////////// // Line Functions ////////////////////////////////////////////////////////////////////// /*void Dib::Line ( int x1, int y1, int x2, int y2, int R, int G, int B ) { int dx, dy, k1, k2, d, x, y; COLORREF Color=RGB ( B, G, R ); dx=x2-x1; dy=y2-y1; d=(dy<<1)-dx; k1=dy<<1; k2=(dy-dx)<<1; x=x1; y=y1; m_Bits[y*m_rdib->Width()+x]=Color; while (x<dx) { if (d<=0) { d+=k1; x++; } else { d+=k2; x++; y++; } m_Bits[y*m_rdib->Width()+x]=Color; } }*/ /* void Dib::Line ( int x1, int y1, int x2, int y2, int R, int G, int B ) { int d, x, y, ax, ay, sx, sy, dx, dy; COLORREF Color=RGB ( B, G, R ); dx=x2-x1; ax=abs ( dx )<<1; sx=(dx<0) ? -1 : 1; dy=y2-y1; ay=abs ( dy )<<1; sy=(dy<0) ? -1 : 1; x=x1; y=y1; if ( ax>ay ) { d=ay-(ax>>1); while ( x!=x2 ) { m_Bits[y*m_rdib->Width()+x]=Color; if ( d>=0 ) { y+=sy; d-=ax; } x+=sx; d+=ay; } } else { d=ax-(ay>>1); while ( y!=y2 ) { m_Bits[y*m_rdib->Width()+x]=Color; if ( d>=0 ) { x+=sx; d-=ay; } y+=sy; d+=ax; } } } void Dib::LineGlass ( int x1, int y1, int x2, int y2, int R, int G, int B, int A ) { int d, x, y, ax, ay, sx, sy, dx, dy; //COLORREF Color=RGB ( B, G, R ); BYTE *dst=(BYTE *)m_Bits; dx=x2-x1; ax=abs ( dx )<<1; sx=(dx<0) ? -1 : 1; dy=y2-y1; ay=abs ( dy )<<1; sy=(dy<0) ? -1 : 1; x=x1; y=y1; if ( ax>ay ) { d=ay-(ax>>1); while ( x!=x2 ) { dst[(y*m_rdib->Width()+x)<<2]=(BYTE)(((B-dst[(y*m_rdib->Width()+x)<<2])*A+(dst[(y*m_rdib->Width()+x)<<2]<<8))>>8); dst[((y*m_rdib->Width()+x)<<2)+1]=(BYTE)(((G-dst[((y*m_rdib->Width()+x)<<2)+1])*A+(dst[((y*m_rdib->Width()+x)<<2)+1]<<8))>>8); dst[((y*m_rdib->Width()+x)<<2)+2]=(BYTE)(((R-dst[((y*m_rdib->Width()+x)<<2)+2])*A+(dst[((y*m_rdib->Width()+x)<<2)+2]<<8))>>8); if ( d>=0 ) { y+=sy; d-=ax; } x+=sx; d+=ay; } } else { d=ax-(ay>>1); while ( y!=y2 ) { dst[(y*m_rdib->Width()+x)<<2]=(BYTE)(((B-dst[(y*m_rdib->Width()+x)<<2])*A+(dst[(y*m_rdib->Width()+x)<<2]<<8))>>8); dst[((y*m_rdib->Width()+x)<<2)+1]=(BYTE)(((G-dst[((y*m_rdib->Width()+x)<<2)+1])*A+(dst[((y*m_rdib->Width()+x)<<2)+1]<<8))>>8); dst[((y*m_rdib->Width()+x)<<2)+2]=(BYTE)(((R-dst[((y*m_rdib->Width()+x)<<2)+2])*A+(dst[((y*m_rdib->Width()+x)<<2)+2]<<8))>>8); if ( d>=0 ) { x+=sx; d-=ay; } y+=sy; d+=ax; } } } */